package cn.skyisazure.metacompare.sqlcompare.utils;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ReUtil;
import cn.skyisazure.metacompare.sqlcompare.meta.ColumnCM;
import cn.skyisazure.metacompare.sqlcompare.mysql.MysqlColumnType;
import com.alibaba.fastjson2.JSON;

import java.util.ArrayList;
import java.util.List;

/**
 * 引擎3 统一的一些方法
 * @author wangjj
 * @date 2024/4/19 11:02
 */
public class UnifyUtil {

    /**
     * 获取mysql类型的字段长度
     * varchar(100) -> 100
     * @return 长度
     */
    public static Integer[] getTypeLength(ColumnCM columnCM){
        String colType = columnCM.getType();
        List<String> allNumbers = ReUtil.findAll("\\d+", colType, 0, new ArrayList<>());
        return allNumbers.stream().map(Convert::toInt).toArray(Integer[]::new);
    }

    /**
     * 判断对象是否都相等（使用ObjUtil.equals对比所有对象）
     * @param objects
     * @return
     */
    public static boolean equalsAll(Object... objects){
        if (ArrayUtil.isEmpty(objects) || objects.length == 1){
            return false;// 不是多个对象传入认为是不相等的
        }
        Object temp = objects[0];// 初始化
        for (int i = 1; i < objects.length; i++) {
            if (ObjUtil.notEqual(temp,objects[i])){
                return false;
            }else {
                temp = objects[i];
            }
        }
        return true;
    }


    /**
     * 对比列，自定义规则
     * @return true：不需要ddl语句更新 false：需要ddl语句更新
     */
    public static boolean columnEq(ColumnCM sourceColumn, ColumnCM targetColumn) {
        // 原则：equal一样即一样
        if (sourceColumn.equals(targetColumn)) {
            return true;
        }
        // clone 副本进行操作，防止修改原对象
        ColumnCM sourceColumnCopy = JSON.parseObject(JSON.toJSONString(sourceColumn), ColumnCM.class);
        ColumnCM targetColumnCopy = JSON.parseObject(JSON.toJSONString(targetColumn), ColumnCM.class);

        // 单行文本缩短长度的进一步判断：
        /*if (columnIsTextShorten(sourceColumn,targetColumn)){
            sourceColumnCopy.setType(targetColumnCopy.getType());
            if (sourceColumnCopy.equals(targetColumnCopy)){
                return true;// 如果修改type修改为target的类型，其余都一样，就等于列相同即可
            }
        }*/
        /*if (columnIsMakeForeignKeyNull(sourceColumn,targetColumn)){
            sourceColumnCopy.setNullEnableFlag(targetColumnCopy.getNullEnableFlag());
            if (sourceColumnCopy.equals(targetColumnCopy)){
                return true;// 如果修改NullEnable修改为target的类型，其余都一样，就等于列相同即可
            }
        }*/
        return false;
    }

    /**
     * 字段是否文本且缩短长度
     * @param sourceColumn
     * @param targetColumn
     * @return
     */
    public static boolean columnIsTextShorten(ColumnCM sourceColumn, ColumnCM targetColumn){
        return UnifyUtil.equalsAll(sourceColumn.getColumnTypeCompare(), targetColumn.getColumnTypeCompare(), MysqlColumnType.TEXT) &&
                UnifyUtil.getTypeLength(sourceColumn)[0].compareTo(UnifyUtil.getTypeLength(targetColumn)[0]) < 0;
    }
    /**
     * 是否外键从可空改为不可空
     * @param sourceColumn
     * @param targetColumn
     * @return
     */
    public static boolean columnIsMakeForeignKeyNull(ColumnCM sourceColumn, ColumnCM targetColumn){
        return UnifyUtil.equalsAll(sourceColumn.getForeignKeyFlag(), targetColumn.getForeignKeyFlag(), true) &&
                !sourceColumn.getNullEnableFlag() &&
                targetColumn.getNullEnableFlag();
    }

}
